[BITS 16]
[CPU 286]

extern _suppr_int9
extern _restor_int9
extern __gestion_touches

global _aff_bmp_db

%ifndef BCC
[SEGMENT _TEXT class=CODE]
%else
[SECTION .text]
%endif

; following values are an offset into the stack
p_size equ   12
delay  equ   10
dim_x  equ   8
dim_x8 equ   6
dim_y  equ   4
pos_x  equ   2
pos_y  equ   0

; void aff_bmp (void far* bmp, unsigned short width, unsigned short height, unsigned short segm);
_aff_bmp_db:
  mov bx,sp
  mov si,[ss:bx+2]
  mov ax,[ss:bx+6]
  mov cx,[ss:bx+10]
  mov es,cx
  ;get the segment
  mov cx,[ss:bx+4]
  mov dx,[ss:bx+8]
  mov bx,dx
;******************************************************************************
;** Afficher une grande bmp avec gestion du scrolling et tout ... (DB)       **
;** > ds:si : image a afficher                                               **
;** > es  : segment video                                                    **
;** > ax  : largeur de l'image                                               **
;** > bx  : hauteur de l'image                                               **
;******************************************************************************
aff_bmp_db:
  push ax
  push bx
  push cx
  push si
  push es
  call _suppr_int9
  pop es
  pop si
  pop cx
  pop bx
  pop ax
push ds
push bp
  mov ds,cx
; push nothing (p_size)
  push ax
; push delay
  push 0x500
;   mov [dim_x],ax
  push ax
  mov dx, ax
  ;On arrondi au multiple de 8 supérieur
  add ax,7
  shr ax,3
;   mov [dim_x8],ax
  push ax
;   mov [dim_y],bx
  push bx
  mov ax,dx
  sub ax,128
;   mov [pos_x],ax
  push ax
  sub bx,64
;   mov [pos_y],bx
  push bx

  mov bp,sp

  mov ax,[ss:bp+dim_y]
  mov bx,[ss:bp+dim_x8]
  mul bl
  mov [ss:bp+p_size], ax

.aff_lp:
push si
    ;affichage
    ;Calcul de la position de départ
    mov ax,[ss:bp+pos_x]
    mov bx,ax
    ;on divise par 8 mais il nous faut un multiple de 16
    and ax,0FFF0h
    shr ax,3
    add si,ax
    mov cx,[ss:bp+pos_y]
    mov ax,[ss:bp+dim_x8]
    mul cx
    add si,ax
    ;offset
    and bx,15
;     mov bh,bl
    ;reinit destination
    xor di,di
    ;64 lignes
    mov cx,64
    .vertical_lp:
      mov dx,cx

; first page
      mov cx,8
        .horizontal_lp:
          ext bl,15
          mov [es:di],ax
          add di,2
        loop .horizontal_lp

; retore precious values
      sub si,16
      sub di,16
      add si,[ss:bp+p_size]

; second page
      mov cx,8
        .horizontal_lp2:
          ext bl,15
          mov [es:di+2048],ax
          add di,2
        loop .horizontal_lp2

; retore precious values
      sub si,16
      sub si,[ss:bp+p_size]

; goto next line
      add si,[ss:bp+dim_x8]

      mov cx,dx
    loop .vertical_lp
pop si
    call __gestion_touches
    cmp al,1
    jne .aff_lp
  .fin:

pop ax
pop ax
pop ax
pop ax
pop ax
pop ax
pop ax
pop bp
pop ds
  call _restor_int9
ret

